// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLExprImpl;
// import com.alibaba.druid.sql.ast.SQLObject;
// import com.alibaba.druid.sql.ast.SQLReplaceable;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.List;
#pragma once

#include <string>
#include <list>

#include "../SQLExpr.h"
#include "../SQLExprImpl.h"
#include "../Object.h"
#include "../SQLReplaceable.h"
#include "../SQLObjectImpl.h"

class SQLASTVisitor;

class SQLAssignItem : virtual public SQLExprImpl, virtual public SQLReplaceable
{
public:
  SQLExpr_ptr target;
  SQLExpr_ptr value;

  SQLAssignItem();
  SHAREDOBJECT(SQLAssignItem);

  // BOOL_ptr equals(Object_ptr  o) {
  //     if (this == o) {
  //         return BOOL::TRUE;
  //     }
  //     if (o == NULL || getClass() != o->getClass()) {
  //         return BOOL::FALSE;
  //     }

  //     SQLAssignItem* that = (SQLAssignItem*) o;

  //     if (target != NULL ? !target->equals(that->target) : that->target != NULL) {
  //         return BOOL::FALSE;
  //     }
  //     return value != NULL ? value->equals(that->value) : that->value == NULL;
  // }

  // int hashCode() {
  //     int result = target != NULL ? target->hashCode() : 0;
  //     result = 31 * result + (value != NULL ? value->hashCode() : 0);
  //     return result;
  // }

  SQLAssignItem(SQLExpr_ptr target, SQLExpr_ptr value);

  virtual SQLObject_ptr clone();

  SQLObject_list_ptr getChildren();

  SQLExpr_ptr getTarget();

  void setTarget(SQLExpr_ptr x);

  SQLExpr_ptr getValue();

  void setValue(SQLExpr_ptr x);

  void accept0(SQLASTVisitor_ptr visitor);

  BOOL_ptr replace(SQLExpr_ptr expr, SQLExpr_ptr target);
};
